package ru.compft.common.services;

import org.springframework.security.acls.model.Permission;
import org.springframework.security.acls.model.Sid;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created with IntelliJ IDEA.
 * User: VVasiliev
 * Date: 02.11.12
 * Time: 17:45
 * Сервис добавления и удаления прав доступа к объектам
 * Может вызываться только Администратором ACL (Роль ACL_ADMIN)
 * По умолчанию все методы только для чтения
 */
@Transactional(readOnly = true)
public interface AclSecurityService {

    /**
     * Добавляем права доступа текущему пользователю
     *
     * @param objectId   - ID объекта, на который устанавливается право доступа
     * @param permission - уровень доступа(READ, WRITE, CREATE, DELETE, ADMINISTRATION)
     * @param className  - Класс объекта
     */
    public void addPermission(String className, Long objectId, Permission permission);

    /**
     * Добавляем права доступа определенному пользователю или роли
     *
     * @param objectId   - ID объекта, на который устанавливается право доступа
     * @param recipient  - роль или имя пользователя обладающие правом доступа к объекту
     * @param permission - уровень доступа(READ, WRITE, CREATE, DELETE, ADMINISTRATION)
     * @param className  - Класс объекта
     */
    public void addPermission(String className, Long objectId, Sid recipient, Permission permission);

    /**
     * Удаляем права доступа
     *
     * @param objectId   - ID объекта, у которого удаляется право доступа
     * @param recipient  - роль или имя пользователя обладающие правом доступа к объекту
     * @param permission - уровень доступа(READ, WRITE, CREATE, DELETE, ADMINISTRATION) который будет удален
     * @param className  - Класс объекта
     */
    public void deletePermission(String className, Long objectId, Sid recipient, Permission permission);

    /**
     * Обновляем права доступа.
     * В качестве параметров приходят новые права доступа, поэтому старые нужно удалить все
     *
     * @param objectId   - ID объекта, на который устанавливается право доступа
     * @param recipient  - роль или имя пользователя обладающие правом доступа к объекту
     * @param permission - новый уровень доступа(READ, WRITE, CREATE, DELETE, ADMINISTRATION) который будет заменен
     * @param className  - Класс объекта
     */
    void updatePermission(String className, Long objectId, Sid recipient, Permission permission);

}
